From 632fab0ca702b600fde492319ab0aa2d9d3bbd08 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Tue, 28 Jan 2020 00:27:36 +0100 Subject: [PATCH] stylecontext: Get rid of gtk_style_context_get() ... and replace all the calls to it with gtk_style_context_peek_property(). All the calls are hacks that need to go away btw. --- docs/reference/gtk/gtk4-sections.txt | 3 - gtk/gtkcellrenderertext.c | 5 +- gtk/gtkflowbox.c | 6 +- gtk/gtkimcontextime.c | 11 +- gtk/gtkstylecontext.c | 180 ++------------------------- gtk/gtkstylecontext.h | 13 -- gtk/gtktexthandle.c | 11 +- gtk/gtktextlayout.c | 10 +- gtk/gtktextutil.c | 25 ++-- gtk/gtktextview.c | 13 +- 10 files changed, 47 insertions(+), 230 deletions(-) diff --git a/docs/reference/gtk/gtk4-sections.txt b/docs/reference/gtk/gtk4-sections.txt index 9e396b17e3..b4a737d2f0 100644 --- a/docs/reference/gtk/gtk4-sections.txt +++ b/docs/reference/gtk/gtk4-sections.txt @@ -4801,12 +4801,9 @@ GtkStyleContext gtk_style_context_new gtk_style_context_add_provider gtk_style_context_add_provider_for_display -gtk_style_context_get gtk_style_context_get_parent -gtk_style_context_get_property gtk_style_context_get_display gtk_style_context_get_state -gtk_style_context_get_valist gtk_style_context_get_color gtk_style_context_get_border gtk_style_context_get_padding diff --git a/gtk/gtkcellrenderertext.c b/gtk/gtkcellrenderertext.c index 7ed41be696..3a57b66d5a 100644 --- a/gtk/gtkcellrenderertext.c +++ b/gtk/gtkcellrenderertext.c @@ -19,6 +19,7 @@ #include "gtkcellrenderertext.h" +#include "gtkcssnumbervalueprivate.h" #include "gtkeditable.h" #include "gtkentry.h" #include "gtkentryprivate.h" @@ -27,7 +28,7 @@ #include "gtkprivate.h" #include "gtksizerequest.h" #include "gtksnapshot.h" -#include "gtkstylecontext.h" +#include "gtkstylecontextprivate.h" #include "gtktreeprivate.h" #include "a11y/gtktextcellaccessible.h" @@ -1631,7 +1632,7 @@ get_size (GtkCellRenderer *cell, style_context = gtk_widget_get_style_context (widget); - gtk_style_context_get (style_context, "font", &font_desc, NULL); + font_desc = gtk_css_style_get_pango_font (gtk_style_context_lookup_style (style_context)); pango_font_description_merge_static (font_desc, priv->font, TRUE); if (priv->scale_set) diff --git a/gtk/gtkflowbox.c b/gtk/gtkflowbox.c index 1844943f80..9a422593dd 100644 --- a/gtk/gtkflowbox.c +++ b/gtk/gtkflowbox.c @@ -80,6 +80,7 @@ #include "gtkadjustment.h" #include "gtkbindings.h" #include "gtkcontainerprivate.h" +#include "gtkcsscolorvalueprivate.h" #include "gtkcssnodeprivate.h" #include "gtkgesturedrag.h" #include "gtkgestureclick.h" @@ -2385,7 +2386,7 @@ gtk_flow_box_snapshot (GtkWidget *widget, { cairo_path_t *path; GtkBorder border; - GdkRGBA *border_color; + const GdkRGBA *border_color; if (vertical) path_from_vertical_line_rects (cr, (GdkRectangle *)lines->data, lines->len); @@ -2405,13 +2406,12 @@ gtk_flow_box_snapshot (GtkWidget *widget, cairo_append_path (cr, path); cairo_path_destroy (path); - gtk_style_context_get (context, "border-color", &border_color, NULL); + border_color = gtk_css_color_value_get_rgba (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_BORDER_TOP_COLOR)); gtk_style_context_get_border (context, &border); cairo_set_line_width (cr, border.left); gdk_cairo_set_source_rgba (cr, border_color); cairo_stroke (cr); - gdk_rgba_free (border_color); } g_array_free (lines, TRUE); diff --git a/gtk/gtkimcontextime.c b/gtk/gtkimcontextime.c index 241ac3d99f..a44ac73304 100644 --- a/gtk/gtkimcontextime.c +++ b/gtk/gtkimcontextime.c @@ -36,8 +36,8 @@ #include "gdk/gdkkeysyms.h" #include "gdk/win32/gdkwin32.h" #include "gtk/gtkimmodule.h" - -#include +#include "gtk/gtkstylecontextprivate.h" +#include "gtk/gtkcssstyleprivate.h" /* avoid warning */ #ifdef STRICT @@ -869,7 +869,6 @@ gtk_im_context_ime_set_preedit_font (GtkIMContext *context) PangoContext *pango_context; PangoFont *font; LOGFONT *logfont; - GtkStyleContext *style; PangoFontDescription *font_desc; g_return_if_fail (GTK_IS_IM_CONTEXT_IME (context)); @@ -923,11 +922,7 @@ gtk_im_context_ime_set_preedit_font (GtkIMContext *context) lang = ""; break; } - style = gtk_widget_get_style_context (widget); - gtk_style_context_get (style, - "font", - &font_desc, - NULL); + font_desc = gtk_css_style_get_pango_font (gtk_style_context_lookup_style (gtk_widget_get_style_context (widget))); if (lang[0]) { diff --git a/gtk/gtkstylecontext.c b/gtk/gtkstylecontext.c index f99783285e..ad22895e90 100644 --- a/gtk/gtkstylecontext.c +++ b/gtk/gtkstylecontext.c @@ -617,142 +617,6 @@ gtk_style_context_remove_provider_for_display (GdkDisplay *display, _gtk_style_cascade_remove_provider (cascade, provider); } -static GtkCssValue * -gtk_style_context_query_func (guint id, - gpointer values) -{ - return gtk_css_style_get_value (values, id); -} - -/** - * gtk_style_context_get_property: - * @context: a #GtkStyleContext - * @property: style property name - * @value: (out) (transfer full): return location for the style property value - * - * Gets a style property from @context for the current state. - * - * Note that not all CSS properties that are supported by GTK+ can be - * retrieved in this way, since they may not be representable as #GValue. - * GTK+ defines macros for a number of properties that can be used - * with this function. - * - * When @value is no longer needed, g_value_unset() must be called - * to free any allocated memory. - **/ -void -gtk_style_context_get_property (GtkStyleContext *context, - const gchar *property, - GValue *value) -{ - GtkStyleContextPrivate *priv = gtk_style_context_get_instance_private (context); - GtkStyleProperty *prop; - - g_return_if_fail (GTK_IS_STYLE_CONTEXT (context)); - g_return_if_fail (property != NULL); - g_return_if_fail (value != NULL); - - prop = _gtk_style_property_lookup (property); - if (prop == NULL) - { - g_warning ("Style property \"%s\" is not registered", property); - return; - } - if (_gtk_style_property_get_value_type (prop) == G_TYPE_NONE) - { - g_warning ("Style property \"%s\" is not gettable", property); - return; - } - - _gtk_style_property_query (prop, - value, - gtk_style_context_query_func, - gtk_css_node_get_style (priv->cssnode)); -} - -/** - * gtk_style_context_get_valist: - * @context: a #GtkStyleContext - * @first_property_name: Name of the first property - * @args: va_list of property name/return location pairs, followed by %NULL - * - * Retrieves several style property values from @context for a given state. - * - * See gtk_style_context_get_property() for details. - * - * As with g_object_get(), a copy is made of the property contents for - * pointer-valued properties, and the caller is responsible for freeing the - * memory in the appropriate manner for the type. For example, by calling - * g_free() or g_object_unref(). Non-pointer-valued properties, such as - * integers, are returned by value and do not need to be freed. - */ -void -gtk_style_context_get_valist (GtkStyleContext *context, - const char *first_property_name, - va_list args) -{ - const gchar *property_name; - - g_return_if_fail (GTK_IS_STYLE_CONTEXT (context)); - g_return_if_fail (first_property_name != NULL); - - property_name = first_property_name; - - while (property_name) - { - gchar *error = NULL; - GValue value = G_VALUE_INIT; - - gtk_style_context_get_property (context, - property_name, - &value); - - G_VALUE_LCOPY (&value, args, 0, &error); - g_value_unset (&value); - - if (error) - { - g_warning ("Could not get style property \"%s\": %s", property_name, error); - g_free (error); - break; - } - - property_name = va_arg (args, const gchar *); - } -} - -/** - * gtk_style_context_get: - * @context: a #GtkStyleContext - * @first_property_name: Name of the first property - * @...: property name /return value pairs, followed by %NULL - * - * Retrieves several style property values from @context for a - * given state. - * - * See gtk_style_context_get_property() for details. - * - * As with g_object_get(), a copy is made of the property contents for - * pointer-valued properties, and the caller is responsible for freeing the - * memory in the appropriate manner for the type. For example, by calling - * g_free() or g_object_unref(). Non-pointer-valued properties, such as - * integers, are returned by value and do not need to be freed. - */ -void -gtk_style_context_get (GtkStyleContext *context, - const char *first_property_name, - ...) -{ - va_list args; - - g_return_if_fail (GTK_IS_STYLE_CONTEXT (context)); - g_return_if_fail (first_property_name != NULL); - - va_start (args, first_property_name); - gtk_style_context_get_valist (context, first_property_name, args); - va_end (args); -} - /* * gtk_style_context_set_id: * @context: a #GtkStyleContext @@ -1317,17 +1181,10 @@ void gtk_style_context_get_color (GtkStyleContext *context, GdkRGBA *color) { - GdkRGBA *c; - g_return_if_fail (color != NULL); g_return_if_fail (GTK_IS_STYLE_CONTEXT (context)); - gtk_style_context_get (context, - "color", &c, - NULL); - - *color = *c; - gdk_rgba_free (c); + *color = *gtk_css_color_value_get_rgba (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_COLOR)); } /** @@ -1432,20 +1289,11 @@ _gtk_style_context_get_cursor_color (GtkStyleContext *context, GdkRGBA *primary_color, GdkRGBA *secondary_color) { - GdkRGBA *pc, *sc; - - gtk_style_context_get (context, - "caret-color", &pc, - "-gtk-secondary-caret-color", &sc, - NULL); if (primary_color) - *primary_color = *pc; + *primary_color = *gtk_css_color_value_get_rgba (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_CARET_COLOR)); if (secondary_color) - *secondary_color = *sc; - - gdk_rgba_free (pc); - gdk_rgba_free (sc); + *secondary_color = *gtk_css_color_value_get_rgba (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_SECONDARY_CARET_COLOR)); } static void @@ -1827,26 +1675,22 @@ AtkAttributeSet * _gtk_style_context_get_attributes (AtkAttributeSet *attributes, GtkStyleContext *context) { - GdkRGBA *bg; - GdkRGBA color; + const GdkRGBA *color; gchar *value; - gtk_style_context_get (context, "background-color", &bg, NULL); + color = gtk_css_color_value_get_rgba (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_BACKGROUND_COLOR)); value = g_strdup_printf ("%u,%u,%u", - (guint) ceil (bg->red * 65536 - bg->red), - (guint) ceil (bg->green * 65536 - bg->green), - (guint) ceil (bg->blue * 65536 - bg->blue)); + (guint) ceil (color->red * 65536 - color->red), + (guint) ceil (color->green * 65536 - color->green), + (guint) ceil (color->blue * 65536 - color->blue)); attributes = add_attribute (attributes, ATK_TEXT_ATTR_BG_COLOR, value); - g_free (value); - gdk_rgba_free (bg); - gtk_style_context_get_color (context, &color); + color = gtk_css_color_value_get_rgba (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_COLOR)); value = g_strdup_printf ("%u,%u,%u", - (guint) ceil (color.red * 65536 - color.red), - (guint) ceil (color.green * 65536 - color.green), - (guint) ceil (color.blue * 65536 - color.blue)); + (guint) ceil (color->red * 65536 - color->red), + (guint) ceil (color->green * 65536 - color->green), + (guint) ceil (color->blue * 65536 - color->blue)); attributes = add_attribute (attributes, ATK_TEXT_ATTR_FG_COLOR, value); - g_free (value); return attributes; } diff --git a/gtk/gtkstylecontext.h b/gtk/gtkstylecontext.h index 46a98bc7ec..331241d78a 100644 --- a/gtk/gtkstylecontext.h +++ b/gtk/gtkstylecontext.h @@ -874,19 +874,6 @@ void gtk_style_context_save (GtkStyleContext *context); GDK_AVAILABLE_IN_ALL void gtk_style_context_restore (GtkStyleContext *context); -GDK_AVAILABLE_IN_ALL -void gtk_style_context_get_property (GtkStyleContext *context, - const gchar *property, - GValue *value); -GDK_AVAILABLE_IN_ALL -void gtk_style_context_get_valist (GtkStyleContext *context, - const char *first_property_name, - va_list args); -GDK_AVAILABLE_IN_ALL -void gtk_style_context_get (GtkStyleContext *context, - const char *first_property_name, - ...) G_GNUC_NULL_TERMINATED; - GDK_AVAILABLE_IN_ALL void gtk_style_context_set_state (GtkStyleContext *context, GtkStateFlags flags); diff --git a/gtk/gtktexthandle.c b/gtk/gtktexthandle.c index 2d3d148ac7..3f993920ba 100644 --- a/gtk/gtktexthandle.c +++ b/gtk/gtktexthandle.c @@ -16,6 +16,8 @@ */ #include "config.h" + +#include "gtkcssnumbervalueprivate.h" #include "gtkprivatetypebuiltins.h" #include "gtktexthandleprivate.h" #include "gtkmarshalers.h" @@ -25,6 +27,7 @@ #include "gtkwidgetprivate.h" #include "gtkgizmoprivate.h" #include "gtkrendericonprivate.h" +#include "gtkstylecontextprivate.h" #include "gtkintl.h" #include @@ -89,11 +92,9 @@ _gtk_text_handle_get_size (GtkTextHandle *handle, GtkStyleContext *context; context = gtk_widget_get_style_context (widget); - - gtk_style_context_get (context, - "min-width", width, - "min-height", height, - NULL); + + *width = _gtk_css_number_value_get (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_MIN_WIDTH), 100); + *height = _gtk_css_number_value_get (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_MIN_HEIGHT), 100); } static gint diff --git a/gtk/gtktextlayout.c b/gtk/gtktextlayout.c index 6d4b41b65a..5a2b419730 100644 --- a/gtk/gtktextlayout.c +++ b/gtk/gtktextlayout.c @@ -76,9 +76,12 @@ */ #include "config.h" + +#include "gtktextlayoutprivate.h" + +#include "gtkcsscolorvalueprivate.h" #include "gtkmarshalers.h" #include "gtkstylecontextprivate.h" -#include "gtktextlayoutprivate.h" #include "gtktextbtree.h" #include "gtktextbufferprivate.h" #include "gtktextiterprivate.h" @@ -3866,7 +3869,7 @@ render_para (GskPangoRenderer *crenderer, int byte_offset = 0; PangoLayoutIter *iter; int screen_width; - GdkRGBA *selection = NULL; + const GdkRGBA *selection = NULL; gboolean first = TRUE; g_return_if_fail (GTK_IS_TEXT_VIEW (crenderer->widget)); @@ -3880,7 +3883,7 @@ render_para (GskPangoRenderer *crenderer, GtkCssNode *selection_node = gtk_text_view_get_selection_node ((GtkTextView*)crenderer->widget); gtk_style_context_save_to_node (context, selection_node); - gtk_style_context_get (context, "background-color", &selection, NULL); + selection = gtk_css_color_value_get_rgba (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_BACKGROUND_COLOR)); gtk_style_context_restore (context); } @@ -4066,7 +4069,6 @@ render_para (GskPangoRenderer *crenderer, if (offset_y) gtk_snapshot_restore (crenderer->snapshot); - gdk_rgba_free (selection); pango_layout_iter_free (iter); } diff --git a/gtk/gtktextutil.c b/gtk/gtktextutil.c index e12ddac84e..bc5be49127 100644 --- a/gtk/gtktextutil.c +++ b/gtk/gtktextutil.c @@ -27,6 +27,8 @@ #include "gtktextview.h" #include "gtktextutil.h" +#include "gtkcsscolorvalueprivate.h" +#include "gtkstylecontextprivate.h" #include "gtktextbuffer.h" #include "gtktextlayoutprivate.h" #include "gtkintl.h" @@ -139,39 +141,26 @@ gtk_text_util_create_drag_icon (GtkWidget *widget, return paintable; } -static GtkCssValue * -query_func (guint id, gpointer values) -{ - return gtk_css_style_get_value (values, id); -} - static void set_attributes_from_style (GtkWidget *widget, GtkTextAttributes *values) { - GtkCssStyle *style; + GtkStyleContext *context; const GdkRGBA black = { 0, }; - const GdkRGBA *color; - GValue value = G_VALUE_INIT; if (!values->appearance.bg_rgba) values->appearance.bg_rgba = gdk_rgba_copy (&black); if (!values->appearance.fg_rgba) values->appearance.fg_rgba = gdk_rgba_copy (&black); - style = gtk_css_node_get_style (gtk_widget_get_css_node (widget)); - color = gtk_css_color_value_get_rgba (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_BACKGROUND_COLOR)); - *values->appearance.bg_rgba = *color; - color = gtk_css_color_value_get_rgba (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_BACKGROUND_COLOR)); - *values->appearance.fg_rgba = *color; + context = gtk_widget_get_style_context (widget); + *values->appearance.bg_rgba = *gtk_css_color_value_get_rgba (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_BACKGROUND_COLOR)); + *values->appearance.fg_rgba = *gtk_css_color_value_get_rgba (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_COLOR)); if (values->font) pango_font_description_free (values->font); - _gtk_style_property_query (_gtk_style_property_lookup ("font"), &value, query_func, style); - - values->font = g_value_get_boxed (&value); - g_value_unset (&value); + values->font = gtk_css_style_get_pango_font (gtk_style_context_lookup_style (context)); } static gint diff --git a/gtk/gtktextview.c b/gtk/gtktextview.c index b405f0e187..dea5a11f11 100644 --- a/gtk/gtktextview.c +++ b/gtk/gtktextview.c @@ -31,6 +31,7 @@ #include "gtkadjustmentprivate.h" #include "gtkbindings.h" +#include "gtkcsscolorvalueprivate.h" #include "gtkdebug.h" #include "gtkintl.h" #include "gtkmain.h" @@ -7437,7 +7438,7 @@ gtk_text_view_set_attributes_from_style (GtkTextView *text_view, { GtkStyleContext *context; const GdkRGBA black = { 0, }; - GdkRGBA *bg; + const GdkRGBA *color; if (!values->appearance.bg_rgba) values->appearance.bg_rgba = gdk_rgba_copy (&black); @@ -7446,15 +7447,15 @@ gtk_text_view_set_attributes_from_style (GtkTextView *text_view, context = gtk_widget_get_style_context (GTK_WIDGET (text_view)); - gtk_style_context_get (context, "background-color", &bg, NULL); - *values->appearance.bg_rgba = *bg; - gdk_rgba_free (bg); - gtk_style_context_get_color (context, values->appearance.fg_rgba); + color = gtk_css_color_value_get_rgba (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_BACKGROUND_COLOR)); + *values->appearance.bg_rgba = *color; + color = gtk_css_color_value_get_rgba (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_COLOR)); + *values->appearance.fg_rgba = *color; if (values->font) pango_font_description_free (values->font); - gtk_style_context_get (context, "font", &values->font, NULL); + values->font = gtk_css_style_get_pango_font (gtk_style_context_lookup_style (context)); } static void -- 2.30.2